// Copyright Epic Games, Inc. All Rights Reserved.

#include "LyraCosmeticCheats.h"
#include "Cosmetics/LyraCharacterPartTypes.h"
#include "LyraControllerComponent_CharacterParts.h"
#include "GameFramework/CheatManagerDefines.h"
#include "System/LyraDevelopmentStatics.h"

#include UE_INLINE_GENERATED_CPP_BY_NAME(LyraCosmeticCheats)

//////////////////////////////////////////////////////////////////////
// ULyraCosmeticCheats

ULyraCosmeticCheats::ULyraCosmeticCheats()
{
#if UE_WITH_CHEAT_MANAGER // 如果有作弊管理器
	if (HasAnyFlags(RF_ClassDefaultObject)) // 如果是类默认对象
	{
		UCheatManager::RegisterForOnCheatManagerCreated(FOnCheatManagerCreated::FDelegate::CreateLambda( // 注册作弊管理器创建事件
			[](UCheatManager* CheatManager)
			{
				CheatManager->AddCheatManagerExtension(NewObject<ThisClass>(CheatManager)); // 将此类的新对象添加为作弊管理器扩展
			}));
	}
#endif
}

/**
 * 添加角色部件作弊命令
 */
void ULyraCosmeticCheats::AddCharacterPart(const FString& AssetName, bool bSuppressNaturalParts)
{
#if UE_WITH_CHEAT_MANAGER // 如果有作弊管理器
	if (ULyraControllerComponent_CharacterParts* CosmeticComponent = GetCosmeticComponent()) // 获取化妆组件
	{
		TSubclassOf<AActor> PartClass = ULyraDevelopmentStatics::FindClassByShortName<AActor>(AssetName); // 根据资源短名称查找部件类
		if (PartClass != nullptr) // 如果找到了类
		{
			FLyraCharacterPart Part; // 创建部件数据结构
			Part.PartClass = PartClass; // 设置部件类

			CosmeticComponent->AddCheatPart(Part, bSuppressNaturalParts); // 调用组件方法添加作弊部件
		}
	}
#endif	
}

/**
 * 替换角色部件作弊命令
 */
void ULyraCosmeticCheats::ReplaceCharacterPart(const FString& AssetName, bool bSuppressNaturalParts)
{
	ClearCharacterPartOverrides(); // 先清除现有的部件覆盖
	AddCharacterPart(AssetName, bSuppressNaturalParts); // 再添加新部件
}

/**
 * 清除角色部件覆盖作弊命令
 */
void ULyraCosmeticCheats::ClearCharacterPartOverrides()
{
#if UE_WITH_CHEAT_MANAGER // 如果有作弊管理器
	if (ULyraControllerComponent_CharacterParts* CosmeticComponent = GetCosmeticComponent()) // 获取化妆组件
	{
		CosmeticComponent->ClearCheatParts(); // 调用组件方法清除作弊部件
	}
#endif	
}

/**
 * 获取化妆组件
 */
ULyraControllerComponent_CharacterParts* ULyraCosmeticCheats::GetCosmeticComponent() const
{
	if (APlayerController* PC = GetPlayerController()) // 获取玩家控制器
	{
		return PC->FindComponentByClass<ULyraControllerComponent_CharacterParts>(); // 查找并返回角色部件控制器组件
	}

	return nullptr; // 返回空指针
}